package main

import (
	"context"
	"fmt"
	"sync"
	"time"
)

var wg sync.WaitGroup

//1.监控全局变量 来完成
// 2.通过chan
//var stop chan bool = make(chan bool, 1)

//var stop bool
// 刚才两种方式 这种方案并不统一 go1.8
//content
//父的content取消，子的content也会取消
func cpuInfo(ctx context.Context) {
	defer wg.Done()
	//for {
	//	if stop {
	//		break
	//	}
	//	time.Sleep(time.Second * 2)
	//	fmt.Println("cpu信息读取完成")
	//
	//}

	//for {
	//	select {
	//	case <-stop:
	//		fmt.Println("退出cpu监控")
	//		return
	//	default:
	//		time.Sleep(time.Second * 2)
	//		fmt.Println("cpu信息读取完成")
	//	}
	//}
	ctx2, _ := context.WithCancel(ctx)
	go memoryInfo(ctx2)
	for {
		select {
		case <-ctx.Done():
			fmt.Println("退出cpu监控")
			return
		default:
			time.Sleep(time.Second * 2)
			fmt.Println("cpu信息读取完成")
		}
	}
}

func memoryInfo(ctx context.Context) {
	defer wg.Done()
	for {
		select {
		case <-ctx.Done():
			fmt.Println("退出内存监控")
			return
		default:
			time.Sleep(time.Second * 2)
			fmt.Println("内存信息读取完成")
		}
	}
}
func main() {
	wg.Add(2)
	ctx, cancel := context.WithCancel(context.Background())
	go cpuInfo(ctx)
	time.Sleep(time.Second * 10)
	cancel()
	//content在web开发中非常的常用 grpc 每个接口调用都会传递 content   gin的http接口也会有context
	//stop = true
	//stop <- true
	wg.Wait()
	fmt.Println("信息监控完成")
}
